4   '   ******************************************

6   '   ** (DFT05-1A) GENERATE/ANALYZE WAVEFORM **

8   '   ******************************************

10 GOSUB 900

12 Q = 32: PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q: K2 = 1 / PI

14 DIM C(2, Q), S(2, Q), KC(2, Q), KS(2, Q)

16 CLS : FOR J = 0 TO Q: FOR I = 1 TO 2: C(I, J) = 0: S(I, J) = 0: NEXT: NEXT

20 CLS  ' ***    MAIN MENU    ***

22 PRINT : PRINT : PRINT "         MAIN MENU": PRINT

24 PRINT " 1 = SIMILARITY THEO  '": PRINT

31 PRINT " 2 = EXIT": PRINT : PRINT

32 PRINT SPC(10); "MAKE SELECTION";

34 A$ = INKEY$: IF A$ = "" THEN 34

36 A = VAL(A$): ON A GOSUB 300, 1000

38 GOTO 20

40 CLS : N = 1: M = 2: K5 = Q: K6 = -1: GOSUB 108

42 FOR J = 0 TO Q: C(2, J) = 0: S(2, J) = 0: NEXT

44 GOSUB 200:   ' - PERFORM DFT

46 GOSUB 140:   ' - PRINT OUT FINAL VALUES

48 PRINT : INPUT "C/R TO CONTINUE"; A$

50 RETURN

80 CLS : GOSUB 150:   ' PRINT HEADING

81 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0: NEXT

82 N = 2: M = 1: K5 = 1: K6 = 1

84 GOSUB 200:   ' INVERSE TRANSFORM

86 GOSUB 140:   ' PRINT OUTPUT

88 PRINT : INPUT "C/R TO CONTINUE"; A$

90 RETURN

100   '  ******************************************

102   '  *         PROGRAM SUBROUTINES            *

104   '  ******************************************

106   '  *       PRINT COLUMN HEADINGS            *

108 PRINT : PRINT : IF COR$ = "P" THEN 116

110 PRINT "FREQ      F(COS)        F(SIN)    FREQ      F(COS)        F(SIN)"

112 PRINT

114 RETURN

116 PRINT "FREQ      F(MAG)       F(THETA)    FREQ       F(MAG)     F(THETA)"

118 GOTO 112

137   ' ******************************

138   ' *       PRINT OUTPUT         *

139   ' ******************************

140 IF COR$ = "P" AND M = 2 THEN GOSUB 170

141 FOR Z = 0 TO Q / 2 - 1

142 PRINT USING "##_     "; Z;

144 PRINT USING "+###.#####_    "; C(M, Z); S(M, Z);

145 PRINT USING "##_    "; (Z + Q / 2);

146 PRINT USING "+###.#####_    "; C(M, Z + Q / 2); S(M, Z + Q / 2)

147 NEXT Z

148 RETURN

150   ' ******************************

152   ' *    PRINT COLUMN HEADINGS   *

154 PRINT

156 PRINT "                       RECONSTRUCTION": PRINT

158 PRINT " T                                 T": PRINT

160 RETURN

170   ' CONVERT FROM RECTANGULAR TO POLAR COORDINATES

172 FOR I = 0 TO Q - 1

174 MAG = SQR(C(M, I) ^ 2 + S(M, I) ^ 2)

175 IF C(M, I) = 0 THEN 190

176 ANGLE = 180 / PI * ATN(S(M, I) / C(M, I))

177 IF C(M, I) > 0 THEN S(M, I) = ANGLE: GOTO 180

178 IF ANGLE > 0 THEN S(M, I) = ANGLE - 180

179 IF ANGLE < 0 THEN S(M, I) = ANGLE + 180

180 C(M, I) = MAG: NEXT

182 RETURN

190 IF S(M, I) = 0 THEN S(M, I) = 0: GOTO 180

192 S(M, I) = 90: GOTO 180

200   ' *******************************

202   ' *     TRANSFORM/RECONSTRUCT   *

204   ' *******************************

206 FOR J = 0 TO Q - 1:   ' SOLVE EQNS FOR EACH FREQUENCY

208 FOR I = 0 TO Q - 1:   ' MULTIPLY AND SUM EACH POINT

210 C(M, J) = C(M, J) + C(N, I) * COS(J * I * K1) + K6 * S(N, I) * SIN(J * I * K1)

211 S(M, J) = S(M, J) - K6 * C(N, I) * SIN(J * I * K1) + S(N, I) * COS(J * I * K1)

212 NEXT I

214 C(M, J) = C(M, J) / K5: S(M, J) = S(M, J) / K5:   ' SCALE RESULTS

216 NEXT J

218 RETURN

220   ' *******************************

222   ' *        PLOT FUNCTIONS       *

224   ' *******************************

225 SFF = 16: SFT = 64

226 SCREEN 9, 1, 1: COLOR 9, 1: CLS : YF = -1: YT = -1

228 LINE (0, 5)-(0, 155): LINE (0, 160)-(0, 310)

230 LINE (0, 155)-(600, 155): LINE (0, 310)-(600, 310)

232 GOSUB 266

234 COLOR 15, 1

236 FOR N = 0 TO Q - 1

238 GOSUB 260

240 LINE (X, Y)-(X, Y): LINE (X, Z)-(X, Z)

242 NEXT N

244 LOCATE 2, 10: PRINT "FREQUENCY DOMAIN (MAG)"

246 LOCATE 14, 12: PRINT "TIME DOMAIN"

248 LOCATE 24, 1

250 INPUT "C/R TO CONTINUE"; A$

252 SCREEN 0, 0, 0

254 RETURN

256   ' *******************************

260 Y = SQR(C(2, N) ^ 2 + S(2, N) ^ 2): Y = 155 - (YF * Y)

262 X = N * 600 / Q: Z = 310 - (YT * C(1, N))

264 RETURN

265   ' *******************************

266 YF = 150 / SFF: YT = 150 / SFT: LINE (0, 5)-(5, 5): LINE (0, 80)-(5, 80)

268 LINE (0, 160)-(5, 160): LINE (0, 235)-(5, 235)

270 LOCATE 1, 2: PRINT SFF: LOCATE 6, 2: PRINT SFF / 2

272 LOCATE 11, 2: PRINT SFT: LOCATE 15, 2: PRINT SFT / 2

274 RETURN

299   ' *******************************

300 CLS :   ' *   SIMILARITY THEO  '    *

302   ' *******************************

304 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0

306 FOR J = 1 TO 2: KC(J, I) = 0: KS(J, I) = 0: NEXT: NEXT

308 CLS : PRINT "WIDTH ="; F9

310 INPUT "WIDTH "; F9

312 IF F9 > Q / 2 THEN PRINT Q / 2; " COMPONENTS IS MAXIMUM": F9 = Q / 2

314 IF F9 < 1 THEN PRINT "1 COMPONENT IS MINIMUM": F9 = 1

316 PRINT SPC(15); "SIMILARITY TEST - WIDTH ="; F9

318 FOR I = Q / 2 - F9 TO Q / 2 + F9: C(1, I) = Q * (SIN(PI * (I - (Q / 2 - F9)) / (2 * F9))) ^ 2: NEXT

320 GOSUB 158:   ' PRINT HEADING

322 M = 1: GOSUB 140:   ' PRINT INPUT FUNCTION

324 PRINT : INPUT "C/R TO CONTINUE"; A$

326 GOSUB 40:   ' TAKE XFORM

328 GOSUB 220:   ' PLOT DATA

330 PRINT "MORE (Y/N)?";

332 A$ = INKEY$: IF A$ = "" THEN 332

334 IF A$ = "Y" OR A$ = "y" THEN 304

336 RETURN

396 RETURN

900 CLS : SCREEN 9, 1: COLOR 15, 1:   ' TEST DESCRIPTION

902 FOR DACNT = 1 TO 11

904 READ A$: PRINT SPC(5); A$

906 NEXT

908 INPUT "C/R TO CONTINUE"; A$

910 SCREEN 0, 0, 0: RETURN

920 DATA "                SIMILARITY THEO  ' TEST"

922 DATA " "

924 DATA "This routine illustrates the Similarity Theo  ' by generating a"

926 DATA "single cycle of SIN^2 wave.  The number of data points over which  "

928 DATA "this function is spread is specified by the variable F9, which the"

930 DATA "user is asked to specify at the beginning of the illustration.  By "

932 DATA "specifying various widths of the function and observing the "

934 DATA "resulting changes in the spectrum the similarity phenomenon is"

936 DATA "completely demonstrated."

938 DATA " "

940 DATA " "

942 DATA " "

1000 STOP



